package com.mikelouis.test.scala.proginscala.scalacheck

/**
 * 我们已经看到，可以使用 check 方法来测试属性或者属性集合。实际上,check方法仅仅是运行方法org.scalacheck.Test.check
 * (或者对于属性集合来说,方法Test.checkProperties, )的便宜方式
 *
 * 模块Test负责ScalaCheck中所有测试的运行。它会生成参数、评估属性, 并且使用逐渐增大的测试数据重复进行(通过增加生成器使用的size参数来控制)。
 * 如果进行了一定数量的测试后，并没有找到失败的测试用例, 那么它会报告属性测试通过
 * Created by yuazhu on 4/19/2015.
 */
object TestExecution {
  // 方法check看起来像这样:
  // def check(params: Test.Parameters, p: Prop): Test.Result

  // 特质Test.Parameters 封装了测试参数信息, 这些信息包括如属性应该被测试的次数、测试数据的大小边界、以及在无法生成参数时ScalaCheck应该尝试的次数等。
  // 在Parameters参数记录中也有回调接口的域,如果需要可以通过编程方式绑定这些回调接口从测试执行者处获得反馈。

  // 方法check 返回 Test.Result的实例，这个结果实例封装测试结果和属性测试的一些统计信息。 Test.Result.status 的类型是 Test.Status, 并可能具有如下值之一
  /** ScalaCheck找到了足够多的属性为真的测试用例,
      因此这个属性被认为是正确的(虽然没有被证明为正确的)。
    * ScalaCheck found enough cases for which the property holds, so the
    * property is considered correct. (It is not proved correct, though). */
  //  case object Passed extends org.scalacheck.Test.Status

  /** ScalaCheck 设法证明了属性是正确的 ScalaCheck managed to prove the property correct */
  //  sealed case class Proved(args: List[Arg]) extends Status

  /** 属性在给定的具体参数下被证明为错误的
    * The property was proved wrong with the given concrete arguments.  */
  //  sealed case class Failed(args: List[Arg], label: String) extends Status

  /** 属性测试穷尽了所有数据，但是还不能生成足够多的具体参数来满足足够次数的属性评估通过所需的前提条件。
    * The property test was exhausted, it wasn't possible to generate enough
    * concrete arguments satisfying the preconditions to get enough passing
    * property evaluations. */
  //  case object Exhausted extends Status

  /** 尝试使用给定的具体参数评估属性时抛出了异常。
    * An exception was raised when trying to evaluate the property with the
    * given concrete arguments. */
  //  sealed case class PropException(args: List[Arg], e: Throwable, label: String) extends Status

  /** 为评估属性生成具体参数时抛出异常。
    * An exception was raised when trying to generate concrete arguments
    * for evaluating the property. */
  //  sealed case class GenException(e: Throwable) extends Status


  // checkProperties是一个列表，返回的是属性测试集合中每个属性的测试数据

}
